package edu.cuit.avatar.mapper;

import edu.cuit.avatar.dto.StudentDto;
import edu.cuit.avatar.pojo.Student;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author <a href="mailto:1020zhaodan@163.com">Adan</a>
 * @version 1.0
 * @date 2025/7/28 10:56
 */
public interface StudentMapper {
    Student findBySsn(String ssn);

    void insert(Student student);

    /**
     * 多个参数的传递
     *  1. arg0, arg1 | param1, param2
     *  2. 将多个参数封装称map(key即为参数名,value为参数值)===>不是很推荐 ===>#{key}
     *  3. 将多个参数封装成JavaBean(*)
     *  4. 使用注解映射参数  @Param
     * @param ssn
     * @param password
     * @return
     */
    Student findBySsnAndPassword(@Param("ssn") String ssn, @Param("password") String password);

    List<Student> query(StudentDto params);

    /**
     * Mybatis中分页查询
     *  1.分页参数 RowBounds
     *      加载所有(fetchSize)数据,然后在内存中进行分页(性能低，内存消耗大; 适合小数据量分页使用)
     *  2.物理分页(性能好; 不通用)
     *      mysql: limit
     *      oracle: offset/rownum
     *      sql server: top
     *  3.使用分页插件(物理分页,通用可移植; 简化编码) ====> PageHelper
     *      1. implementation 'com.github.pagehelper:pagehelper:6.1.1'
     *      2. 配置拦截器插件
     *      3. 使用pageHelper
     *
     *  原理: 基于java的动态代理和责任链模式实现拦截器的机制
     * @return
     */
    List<Student> query2(RowBounds bounds);

    List<Student> query3(@Param("offset") int offset, @Param("size") int size);

    List<Student> query4();

    void getAverageScoreBySsn(Map<String, ?> params);

    Set<Student> findByDepdId(Integer deptId);
}
